package org.styx.common.utils;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * TCC模式下使用
 * 第二阶段 Confirm 或 Cancel 阶段对第一阶段的成功与否进行判断，在第一阶段成功时需要保存一个标识。
 * 幂等性：就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的，不会因为多次点击而产生了了副作用
 * @date 2021/9/30
 * @auther uranus
 */
public class ResultHolder {
    private static Map<Class<?>, Map<String,String>> map =
        new ConcurrentHashMap<>();

    /**
     *
     * @param actionClass
     * @param xid
     * @param v
     */
    public static void setResult(Class<?> actionClass,String xid,String v){
        Map<String,String> results=map.get(actionClass);
        if(results==null){
            synchronized (map){
                if(results==null){
                    results=new ConcurrentHashMap<>();
                    map.put(actionClass,results);
                }
            }
        }
        results.put(xid,v);
    }


    /**
     * 得到的结果
     *
     * @param actionClass 操作类
     * @param xid         xid
     * @return {@link String}
     */
    public static String getResult(Class<?> actionClass,String xid){
        Map<String,String> results=map.get(actionClass);
        if(results!=null){
            return results.get(xid);
        }
        return null;
    }


    /**
     * 删除的结果
     *
     * @param actionClass 操作类
     * @param xid         xid
     */
    public static void removeResult(Class<?> actionClass,String xid){
        Map<String,String> results=map.get(actionClass);
        if(results!=null){
            results.remove(xid);
        }
    }

}
